home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1997
/
MacHack 1997.toast
/
Hacks
/
Hacks ’93
/
sort
/
Source
/
quicker.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-10-15
|
2KB
|
78 lines
#include "sortdata.h"
typedef struct {
long* sortdata;
swp sw;
short *stopflag;
cmp cm;
long sp;
long sep;
long *plv;
long *phv;
} quicker_static, *pquicker_static;
void main(long maxdata, long* sortdata, swp sw, cmp cm, short* stopflag);
pascal void doquicker(long startvalue, long endvalue, pquicker_static quickptr);
void main(long maxdata, long* sdata, swp swpf, cmp cmpf, short* stflag)
{
quicker_static quick;
quick.sortdata = sdata;
quick.sw = swpf;
quick.cm = cmpf;
quick.stopflag = stflag;
doquicker(0, maxdata -1, &quick);
}
pascal void doquicker(long startvalue, long endvalue, pquicker_static quickptr)
{
long lv,hv;
lv = startvalue;
hv = endvalue;
quickptr->plv = &(quickptr->sortdata[lv]);
quickptr->phv = &(quickptr->sortdata[hv]);
quickptr->sp = (startvalue+endvalue)>>1;
quickptr->sep = quickptr->sortdata[quickptr->sp];
do {
while ((lv != quickptr->sp) && ((*(quickptr->cm))(lv, quickptr->sp, *(quickptr->plv), quickptr->sep) < 0)) {
if (*(quickptr->stopflag)) {
return;
}
lv++;
quickptr->plv++;
}
while ((hv != quickptr->sp) && ((*(quickptr->cm))(hv, quickptr->sp, *(quickptr->phv), quickptr->sep) > 0)) {
if (*(quickptr->stopflag)) {
return;
}
hv--;
quickptr->phv--;
}
if (lv <= hv) {
if ((*(quickptr->cm))(lv, hv, *(quickptr->plv), *(quickptr->phv)) > 0) {
(*(quickptr->sw))(lv, hv, quickptr->plv, quickptr->phv);
}
lv++;
quickptr->plv++;
hv--;
quickptr->phv--;
}
} while (lv <= hv);
if (startvalue < hv) {
doquicker(startvalue, hv, quickptr);
}
if (endvalue > lv) {
doquicker(lv, endvalue, quickptr);
}
}